/*
 * ArbreGenealogique.h
 *
 *  Created on: 2013-11-28
 *      Author: Jean-Simon,Simon
 */

#ifndef ARBREGENEALOGIQUE_H_
#define ARBREGENEALOGIQUE_H_
#include <string>
#include <stdexcept>
#include <iostream>
#include <vector>
#include <list>
#include "Personne.h"

namespace tp3
{
class ArbreGenealogique
{
public:
	ArbreGenealogique(Personne &p_personne);
	~ArbreGenealogique();

	void ajouterEnfant(Personne& p_parent, Personne& p_enfant);
	std::vector<Personne*> enfantsDe(const Personne& p_parent) const;
	bool appartient(const Personne& p_personne) const;

private:
	class Noeud
	{
	public:
		Personne* m_personne;
		Noeud* m_gauche; 	//Fils
		Noeud* m_droite;	//Frère

		/**
		 * \brief Constructeur de la classe Noeud
		 *
		 * \post un noeud typique est intialisé
		 */
		Noeud(Personne& p_personne) :
			m_gauche(0), m_droite(0)
		{
			m_personne = new Personne(p_personne);
		}
	};

	void trouvePersonne(const Personne& p_personne, Noeud*& p_trouve) const;
	void _trouvePersonne(Noeud* p_racine, const Personne& p_personne, Noeud*& p_trouve) const;
	void _postOrdre(Noeud* p_Ncourant, std::vector<Personne*>& p_vPersonnes) const;

	Noeud* m_racine;
	std::string m_nom;
};
}
#endif /* ARBREGENEALOGIQUE_H_ */
